package com.dimples.dd.system.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dimples.dd.common.model.DDAuthUser;
import com.dimples.dd.common.model.Option;
import com.dimples.dd.common.pojo.PageResult;
import com.dimples.dd.system.model.entity.SystemUsersDO;
import com.dimples.dd.system.model.form.UserForm;
import com.dimples.dd.system.model.query.UserPageQuery;
import com.dimples.dd.system.model.vo.UserInfoVO;
import com.dimples.dd.system.model.vo.UserPageVO;
import com.dimples.dd.system.model.vo.UserSimpleVO;

import java.util.List;
import java.util.Set;

/**
 * 用户业务接口
 *
 * @author zhongyj <1126834403@qq.com><br/>
 * @date 2024/6/11
 */
public interface SystemUsersService extends IService<SystemUsersDO> {

    /**
     * 根据用户名获取认证信息
     *
     * @param username 用户名
     * @return {@link com.dimples.dd.common.model.DDAuthUser}
     */
    DDAuthUser getUserAuthUser(String username);

    /**
     * 用户分页列表
     *
     * @param queryParams 用户对象，用于传递查询条件
     * @return {@link Page<UserPageVO>}
     */
    Page<UserPageVO> getUserPage(UserPageQuery queryParams);

    /**
     * 获取用户表单数据
     *
     * @param userId 用户ID
     * @return {@link UserForm}
     */
    UserForm getUserFormData(Long userId);

    /**
     * 新增用户
     *
     * @param userForm userForm
     */
    void createUser(UserForm userForm);

    /**
     * 修改用户
     *
     * @param userForm userForm
     */
    void updateUser(UserForm userForm);

    /**
     * 修改用户状态
     *
     * @param userId 用户编号
     * @return 结果
     */
    Boolean updateUserStatus(Long userId);

    /**
     * 重置用户密码
     *
     * @param userId   用户ID
     * @param password 密码
     * @return {@link Boolean}
     */
    void updateUserPassword(Long userId, String password);

    /**
     * 删除用户
     *
     * @param userIds 用户 id数组
     */
    void deleteUsers(String[] userIds);

    /**
     * 获取登录用户信息
     *
     * @return {@link UserInfoVO}
     */
    UserInfoVO getCurrentUserInfo();

    /**
     * 根据状态获取用户列表
     *
     * @param status 状态
     * @return {@link List<SystemUsersDO>}
     */
    List<SystemUsersDO> getUserListByStatus(Integer status);

    /**
     * 获取用户精简信息列表
     *
     * @return {@link List< UserSimpleVO >}
     */
    List<UserSimpleVO> getSimpleUserList();

    /**
     * 获取用户下拉选项-带分页
     *
     * @param userPageQuery 用户分页查询
     * @return {@link PageResult<Option<Long>>}
     */
    PageResult<Option<Long>> listUserOptions(UserPageQuery userPageQuery);

    /**
     * 更新最后登录时间
     *
     * @param userId   用户ID
     * @param loginIp 客户端IP
     */
    void updateUserLogin(Long userId, String loginIp);

    /**
     * 添加用户到在线用户集合
     *
     * @param username 用户名
     */
    void addOnlineUser(String username);

    /**
     * 从在线用户集合移除用户
     *
     * @param username 用户名
     */
    void removeOnlineUser(String username);

    /**
     * 获取所有在线用户
     *
     * @return 在线用户集合
     */
    Set<String> getAllOnlineUsers();

    /**
     * 获取在线的接收者
     * 从所有接收者中过滤出在线的接收者
     *
     * @param receivers 接收者
     * @return 在线的接收者集合
     */
    Set<String> getOnlineReceivers(Set<String> receivers);

    /**
     * 获取在线用户数量
     *
     * @return 在线用户数量
     */
    int getOnlineUserCount();
}
